package com.project.biz.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.project.biz.*;
import com.project.common.exception.ServiceException;
import com.project.entity.CmsProduct;
import com.project.entity.CmsProductSku;
import com.project.entity.CmsProductSpec;
import com.project.mapper.CmsProductMapper;
import com.project.pojo.dto.*;
import com.project.pojo.model.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Description: 商品业务层接口实现类
 * @Author: zhuchi
 * @CreateDate: 2020/10/14 19:58
 * @Version: 1.0
 */
@Slf4j
@Service
public class CmsProductBizImpl extends ServiceImpl<CmsProductMapper, CmsProduct> implements CmsProductBiz {

    /**
     * 商品标签业务层接口类
     */
    @Autowired
    private CmsProductLabelBiz productLabelBiz;

    /**
     * 商品规格业务层接口类
     */
    @Autowired
    private CmsProductSpecBiz productSpecBiz;

    /**
     * 商品SKU业务层接口类
     */
    @Autowired
    private CmsProductSkuBiz productSkuBiz;

    /**
     * 商品评价业务层接口类
     */
    @Autowired
    private CmsProductEvaBiz productEvaBiz;

    /**
     * 分页查询商品
     * @param productModel
     * @return
     */
    public IPage<ProductDTO> selectProduct(ProductModel productModel){
        Page<ProductDTO> page = new Page<>(productModel.getPageNo(), productModel.getPageSize());
        return this.baseMapper.selectProduct(page, productModel);
    }

    /**
     * 查询商品返回List
     * @param productModel
     * @return
     */
    public List<ProductDTO> selectProductList(ProductModel productModel){
        return this.baseMapper.selectProductList(productModel);
    }

    /**
     * 根据商品ID获取商品信息
     * @param productId
     * @return
     */
    public ProductDTO selectProductById(Long productId){
        ProductModel productModel = new ProductModel();
        productModel.setProductId(productId);
        return this.baseMapper.selectProductById(productModel);
    }

    /**
     * 添加商品
     * @param addProductModel
     * @param userId
     * @return
     */
    @Transactional(rollbackFor = Exception.class , isolation = Isolation.REPEATABLE_READ, timeout = 30)
    public int addProduct(AddProductModel addProductModel, Long userId){
        int result = 0;
        int maxSort = this.baseMapper.getMaxSort();

        CmsProduct cmsProduct = new CmsProduct();
        BeanUtils.copyProperties(addProductModel, cmsProduct);
        cmsProduct.setSales(0);                 //销量
        cmsProduct.setPraise(0);                //评价数量
        cmsProduct.setViews(0);                 //浏览量
        cmsProduct.setSort(maxSort+1);          //排序
        cmsProduct.setCreateUser(userId);       //创建人
        cmsProduct.setCreateTime(new Date());   //创建时间
        cmsProduct.setState(0);                 //状态（0:下架,1:上架）
        cmsProduct.setStatus(1);                //删除标志（-1:删除,1:正常）

        result = this.baseMapper.insert(cmsProduct);

        if (result > 0){
            //维护商品标签
            int updateProductLabel = this.productLabelBiz.updateProductLabel(addProductModel.getProductLabel(), cmsProduct.getProductId(), userId);
            //维护商品规格
            int updateProductSpec = this.productSpecBiz.updateProductSpec(addProductModel.getProductSpecs(), cmsProduct.getProductId());
            //维护商品SKU信息
            int updateProductSku = this.productSkuBiz.updateProductSku(addProductModel.getProductSkus(), cmsProduct.getProductId());
            log.info("添加商品,维护商品标签：{}，维护商品规格：{}，维护商品SKU信息：{}", updateProductLabel, updateProductSpec, updateProductSku);
        }

        return result;
    }

    /**
     * 修改商品
     * @param updateProductModel
     * @param userId
     * @return
     */
    @Transactional(rollbackFor = Exception.class , isolation = Isolation.REPEATABLE_READ, timeout = 30)
    public int updateProduct(UpdateProductModel updateProductModel, Long userId){
        int result = 0;
        CmsProduct cmsProduct = this.baseMapper.selectById(updateProductModel.getProductId());
        if (null == cmsProduct){
            throw new ServiceException("商品不存在");
        }else if (cmsProduct.getState() == 1){//状态（0:下架,1:上架）
            throw new ServiceException("商品已上架,不能修改");
        }
        BeanUtils.copyProperties(updateProductModel, cmsProduct);
        cmsProduct.setUpdateUser(userId);        //修改人
        cmsProduct.setUpdateTime(new Date());    //修改时间

        result = this.baseMapper.updateById(cmsProduct);

        if (result > 0){
            //维护商品标签
            int updateProductLabel = this.productLabelBiz.updateProductLabel(updateProductModel.getProductLabel(), cmsProduct.getProductId(), userId);
            //维护商品规格
            int updateProductSpec = this.productSpecBiz.updateProductSpec(updateProductModel.getProductSpecs(), cmsProduct.getProductId());
            //维护商品SKU信息
            int updateProductSku = this.productSkuBiz.updateProductSku(updateProductModel.getProductSkus(), cmsProduct.getProductId());
            log.info("修改商品,维护商品标签：{}，维护商品规格：{}，维护商品SKU信息：{}", updateProductLabel, updateProductSpec, updateProductSku);
        }

        return result;
    }

    /**
     * 获取商品详情
     * @param productId
     * @return
     */
    public ProductDetailDTO getProductDetail(Long productId){
        CmsProduct cmsProduct = this.baseMapper.selectById(productId);
        if (null == cmsProduct){
            throw new ServiceException("商品不存在");
        }else if (cmsProduct.getStatus() == -1){//删除标志（-1:删除,1:正常）
            throw new ServiceException("商品不存在");
        }

        //增加浏览量
        cmsProduct.setViews(cmsProduct.getViews() + 1);
        this.baseMapper.updateById(cmsProduct);

        ProductDetailDTO productDetailDTO = new ProductDetailDTO();

        //获取商品详细信息
        ProductDTO productDTO = this.selectProductById(productId);
        BeanUtils.copyProperties(productDTO, productDetailDTO);

        //获取商品标签
        List<String> productLabel = this.productLabelBiz.getProductLabel(productId);
        productDetailDTO.setProductLabel(productLabel);

        //商品规格
        List<CmsProductSpec> productSpecs = this.productSpecBiz.getProductSpecs(productId);
        productDetailDTO.setProductSpecs(productSpecs);

        //商品SKU信息
        List<CmsProductSku> productSkus = this.productSkuBiz.getProductSku(productId);
        productDetailDTO.setProductSkus(productSkus);

        //商品评论信息（1条）
        List<ProductEvaDTO> productEvaDTOS = new ArrayList<>();
        GetProductEvaModel getProductEvaModel = new GetProductEvaModel();
        getProductEvaModel.setPageNo(1L);
        getProductEvaModel.setPageSize(1L);
        getProductEvaModel.setProductId(productId);
        IPage<ProductEvaDTO> productEvaDTOIPage = this.productEvaBiz.getProductEva(getProductEvaModel);
        if (null != productEvaDTOIPage && null != productEvaDTOIPage.getRecords() && productEvaDTOIPage.getRecords().size() > 0){
            productEvaDTOS = productEvaDTOIPage.getRecords();
        }
        productDetailDTO.setProductEvas(productEvaDTOS);

        return productDetailDTO;
    }

    /**
     * 删除商品
     * @param productId
     * @param userId
     * @return
     */
    public int delProduct(Long productId, Long userId){
        CmsProduct cmsProduct = this.baseMapper.selectById(productId);
        if (null == cmsProduct){
            throw new ServiceException("商品不存在");
        }else if (cmsProduct.getStatus() == -1){//删除标志（-1:删除,1:正常）
            throw new ServiceException("商品不存在");
        }
        cmsProduct.setStatus(-1);//删除标志（-1:删除,1:正常）
        cmsProduct.setUpdateUser(userId);
        cmsProduct.setUpdateTime(new Date());
        return this.baseMapper.updateById(cmsProduct);
    }

    /**
     * 商品上下架
     * @param updateProductStateModel
     * @param userId
     * @return
     */
    public int updateProductState(UpdateProductStateModel updateProductStateModel, Long userId){
        CmsProduct cmsProduct = this.baseMapper.selectById(updateProductStateModel.getProductId());
        if (null == cmsProduct){
            throw new ServiceException("商品不存在");
        }else if (cmsProduct.getStatus() == -1){//删除标志（-1:删除,1:正常）
            throw new ServiceException("商品不存在");
        }
        cmsProduct.setState(updateProductStateModel.getState());//状态（0:下架,1:上架）
        cmsProduct.setUpdateUser(userId);
        cmsProduct.setUpdateTime(new Date());
        return this.baseMapper.updateById(cmsProduct);
    }

    /**
     * 根据商品ID获取商品规格及SKU信息
     * @param productId
     * @return
     */
    public ProductSpecAndSkuDTO getProductSpecAndSku(Long productId){
        ProductSpecAndSkuDTO productSpecAndSkuDTO = new ProductSpecAndSkuDTO();
        //商品规格
        List<CmsProductSpec> productSpecs = this.productSpecBiz.getProductSpecs(productId);
        productSpecAndSkuDTO.setProductSpecs(productSpecs);

        //商品SKU信息
        List<CmsProductSku> productSkus = this.productSkuBiz.getProductSku(productId);
        productSpecAndSkuDTO.setProductSkus(productSkus);
        return productSpecAndSkuDTO;
    }

    /**
     * 商品评论数量+1
     * @param productId
     * @return
     */
    public int addProductEvaNum(Long productId){
        int result = 0;
        CmsProduct product = this.baseMapper.selectById(productId);
        if (null != product){
            product.setPraise((product.getPraise() + 1));
            result = this.baseMapper.updateById(product);
        }

        return result;
    }

    /**
     * 增加商品销量
     * @param productId
     * @param num
     * @return
     */
    public int addProductSales(Long productId, Integer num){
        int result = 0;
        CmsProduct product = this.baseMapper.selectById(productId);
        if (null != product){
            product.setSales((product.getSales() + num));
            result = this.baseMapper.updateById(product);
        }

        return result;
    }

    /**
     * 修改商品排序值
     * @param updateProductSortModel
     * @param userId
     * @return
     */
    public int updateProductSort(UpdateProductSortModel updateProductSortModel, Long userId){
        int result = 0;
        CmsProduct product = this.baseMapper.selectById(updateProductSortModel.getProductId());
        if (null != product){
            product.setSort(updateProductSortModel.getSort());
            product.setUpdateUser(userId);
            product.setUpdateTime(new Date());
            result = this.baseMapper.updateById(product);
        }

        return result;
    }

    /**
     * 商品导出查询
     * @param productModel
     * @return
     */
    public List<ProductExportDTO> selectExportProductData(ProductModel productModel){
        return this.baseMapper.selectExportProductData(productModel);
    }

}
